package com.cloud.util.log;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.cloud.util.log.ILog;
import com.cloud.util.log.ILogLeval;
import com.cloud.util.log.ILogMessage;
import com.cloud.util.log.support.LogMessage;

/**
 * 日志组件工厂，获取日志记录器及日志详细内容
 * 
 * @version 1.0
 * @date 2012-09-01
 * @author DWZ框架组
 */
public abstract class ALogFactory {

	/** 调试级别日志 */
	public final static ILogLeval LOG_LEVAL_DEBUG = ILogLeval.D;
	/** 提示级别日志 */
	public final static ILogLeval LOG_LEVAL_INFO = ILogLeval.I;
	/** 警告级别日志 */
	public final static ILogLeval LOG_LEVAL_WARN = ILogLeval.W;
	/** 错误级别日志 */
	public final static ILogLeval LOG_LEVAL_ERROR = ILogLeval.E;

	/* 日志记录器 */
	private static ILog log;
	/* 日志索引码前缀 */
	private static final String LOG_KEY_PRE = "A";
	/* 默认日志记录器 */
	private static String DEFULT_LOG = "com.cloud.util.log.support.Log";

	/* 年月日字符显示 */
	private static final SimpleDateFormat YYYYMMDD_FORMAT = new SimpleDateFormat(
			"yyMMdd");
	/* 日分秒字符显示 */
	private static final SimpleDateFormat HHMMSS_FORMAT = new SimpleDateFormat(
			"HHmmss");

	/**
	 * 初始化日志记录器
	 * 
	 * @param logClass
	 */
	public static void initConfig(String logClass) {

		if (null == log) {
			DEFULT_LOG = logClass;
			try {
				log = (ILog) Class.forName(DEFULT_LOG).newInstance();
			} catch (Exception e) {
				throw new RuntimeException("设置日志记录器[" + logClass + "]失败："
						+ e.getMessage());
			}
		} else {
			throw new RuntimeException("获取日志记录器[" + DEFULT_LOG
					+ "]已开始工作，不能重新设置为[" + logClass + "]。");
		}

	}

	/**
	 * 获取日志组件
	 * 
	 * @return
	 */
	public static ILog getLog() {

		try {
			return null == log ? (ILog) Class.forName(DEFULT_LOG).newInstance()
					: log;
		} catch (Exception e) {
			throw new RuntimeException("获取日志记录器失败" + e.getMessage());
		}

	}

	/**
	 * 根据需要记录的日志信息，获取日志对象
	 * 
	 * @param logInfo
	 *            ：日志内容
	 * @return
	 */
	public static ILogMessage getLogMessage(String logInfo) {

		LogMessage logMessage = new LogMessage(logInfo);
		return logMessage;

	}

	/**
	 * 根据需要记录的日志信息，获取日志对象
	 * 
	 * @param logModule
	 *            ：记日志的模块
	 * @param logInfo
	 *            ：日志内容
	 * @return
	 */
	public static ILogMessage getLogMessage(String logModule, String logInfo) {

		return new LogMessage(logModule, logInfo);

	}

	/**
	 * 根据需要记录的日志信息，获取日志对象
	 * 
	 * @param logModule
	 *            ：记日志的模块
	 * @param logKey
	 *            ：日志内容的搜索关键值
	 * @param logInfo
	 *            ：日志内容
	 * @return
	 */
	public static ILogMessage getLogMessage(String logModule, String logKey,
			String logInfo) {

		return new LogMessage(logModule, logKey, logInfo);

	}

	/**
	 * 根据需要记录的日志信息，获取日志对象
	 * 
	 * @param logLeval
	 *            ：日志级别
	 * @param logModule
	 *            ：记日志的模块
	 * @param logKey
	 *            ：日志内容的搜索关键值
	 * @param logInfo
	 *            ：日志内容
	 * @return
	 */
	public static ILogMessage getLogMessage(ILogLeval logLeval,
			String logModule, String logKey, String logInfo) {

		return new LogMessage(logLeval, logModule, logKey, logInfo);

	}

	/**
	 * 获取日志索引码，索引码格式：索引码按格式：字符A+日期yyMMdd+时间hhmmss+随机码(01-99)
	 * 
	 * @return
	 */
	public static String getLogKey() {

		return LOG_KEY_PRE + YYYYMMDD_FORMAT.format(new Date())
				+ HHMMSS_FORMAT.format(new Date())
				+ (10 + (int) (Math.random() * 90));

	}

	public static void main(String[] args) {

		ALogFactory.getLog().info(ALogFactory.getLogMessage("测试写日志"));

	}

}
